#include<iostream>
#include<future>
#include<thread>
#define mode 1
//使用async可以返回一个未来体，来拿到函数的返回值。
//通过承诺体，使用其关联的未来体可以拿到在承诺体里设置的值
//future        没有复制构造,有移动构造；只能get一次
//shared_future 可以复制，也可以移动；   可以get很多次
//promise       没有复制构造,有移动构造；setvalue只能调用一次。
//为什么用promise,因为他可以保证有future的线程阻塞到 对应线程(有promise)内部的值就绪。
int main(int n,char **agv)
{   
//这是promise,承诺获取值
#if mode==1
    using std::cout,std::endl,std::promise,std::thread;
    
    //分配promise thread waitset
    promise<int> pro;
    thread th;
    
    //延迟赋值一下    
    auto waitset= [&pro]()
    {   
        std::this_thread::sleep_for(std::chrono::seconds(1));
        pro.set_value(1);
    };
 
    th=thread(waitset);
    
    //阻塞获取值
    cout<<pro.get_future().get();
    
    th.join();
    return 0;
#endif

#if mode==0
    using std::cout,std::endl,std::promise;

    //two promise one future ono shared_future    
    promise<int&> p;
    promise<int&> p1;

    std::shared_future Sfuture=p.get_future();
    std::future future=p1.get_future();
    
    //promise set
    int a=1;
    cout<<&a<<endl;
    p.set_value(a);
    //error p.set_value(a);
    p1.set_value(a);
    
    //future get
    cout<<&Sfuture.get()<<endl;
    cout<<&Sfuture.get()<<endl;
    cout<<&future.get()<<endl;
    //error cout<<&future.get()<<endl;
    return 0;
#endif
}